public class Solution8 {
    //1314. 矩阵区域和
    public int[][] matrixBlockSum(int[][] mat, int k) {
        int n = mat.length, m = mat[0].length;
        int[][] dp = new int[n+1][m+1];
        int[][] answer = new int[n][m];
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + mat[i-1][j-1];
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                int x1 = Math.max(0,i-k)+1;
                int y1 = Math.min(i+k,n)+1;
                int x2 = Math.max(0,j-k)+1;
                int y2 = Math.min(j+k,n)+1;
                answer[i][j] = dp[x2][y2] - dp[x1][y2] - dp[x2][y1] + dp[x1-1][y1-1];
            }
        }
        return answer;
    }
}
